package negocio.bd;

import base.Servicio;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import utiles.ConexionBD;
import utiles.ConversorFecha;
import utiles.Logger;

/**
 *
 * @author Efren
 */
public class BDServicios {
    public static final String idServicio = "idServicio";
    public static final String nombre = "nombre";
    public static final String descripcion = "descripcion";
    public static final String precio = "precio";
    public static final String tiempoEstimado = "tiempoEstimado";
    public static final String unidades = "unidades";
    public static final int buscarPorNombre = 1;
    public static final int buscarPorPrecio = 2;
    public static final int buscarPorId = 3;
    public static final int ASC = 1;
    public static final int DESC = 2;
    
    public static Servicio[] buscar(int campoBusqueda, String busqueda, int orden, boolean exacta){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Servicio> servicios = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Servicios` ";
        if  (campoBusqueda == buscarPorPrecio){
                query += "WHERE " + precio + " like '" + busqueda +"%' ORDER BY " + precio;
        } else {
                if (buscarPorNombre == campoBusqueda){
                    query += "WHERE " + nombre + " like '" + busqueda + "%' ORDER BY " + nombre;
                } else {
                    query += "WHERE " + idServicio + " like '" + busqueda + "%' ORDER BY " + idServicio;
                }
        }
        //Si la busqueda a de ser exacta quitar like y % de la consulta
        if (exacta){
            query = query.replaceAll("like", "=");
            query = query.replace("%", "");
        }
        if (orden == DESC){
            query += " DESC";
        } else {
            query += " ASC";
        }
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Servicio temp = new Servicio();
                temp.setIdServicio(res.getInt(idServicio));
                temp.setNombre(res.getString(nombre));
                temp.setDescripcion(res.getString(descripcion));
                temp.setPrecio(res.getFloat(precio));
                temp.setTiempoEstimado(res.getInt(tiempoEstimado));
                servicios.add(temp);
            }
            return servicios.toArray(new Servicio[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static Servicio obtener(long idServicio){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Servicios` WHERE " +BDServicios.idServicio + " = " + idServicio);
            while (res.next()){
                Servicio temp = new Servicio();
                temp.setIdServicio(res.getInt(BDServicios.idServicio));
                temp.setNombre(res.getString(nombre));
                temp.setDescripcion(res.getString(descripcion));
                temp.setPrecio(res.getFloat(precio));
                temp.setTiempoEstimado(res.getInt(tiempoEstimado));
                return temp;
            }
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean existe(long idServicio){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Servicios` WHERE " + BDServicios.idServicio + " = " + idServicio);
            if (res.next()){
                return true;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }
    public static Servicio[] obtenerTodos(){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Servicio> servicios = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Servicios`";
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Servicio temp = new Servicio();
                temp.setIdServicio(res.getInt(idServicio));
                temp.setNombre(res.getString(nombre));
                temp.setDescripcion(res.getString(descripcion));
                temp.setPrecio(res.getFloat(precio));
                temp.setTiempoEstimado(res.getInt(tiempoEstimado));
                servicios.add(temp);
            }
            return servicios.toArray(new Servicio[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static boolean insertar(Servicio servicio){
        if (!existe(servicio.getIdServicio())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`.`Servicios` VALUES (?,?,?,?,?)");
                insert.setInt(1, servicio.getIdServicio());
                insert.setString(2, servicio.getNombre());
                String sdescripcion = servicio.getDescripcion();
                if (sdescripcion == null || sdescripcion.isEmpty()){
                    sdescripcion = "";
                }
                insert.setString(3, sdescripcion);
                insert.setFloat(4, servicio.getPrecio());
                insert.setInt(5, servicio.getTiempoEstimado());
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    public static boolean actualizar(Servicio servicio){
        if (existe(servicio.getIdServicio())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement update = db.prepareStatement("UPDATE `gestionTienda`.`Servicios` SET " + nombre + " = ? " + descripcion +" = ? " +  precio + " = ? " + tiempoEstimado+ " = ? " +" WHERE " + idServicio + " = ?");
                update.setString(1, servicio.getNombre());
                String sdescripcion = servicio.getDescripcion();
                if (sdescripcion == null || sdescripcion.isEmpty()){
                    sdescripcion = "";
                }
                update.setString(2, sdescripcion);
                update.setFloat(3, servicio.getPrecio());
                update.setInt(4, servicio.getTiempoEstimado());
                update.setInt(5, servicio.getIdServicio());
                if (update.executeUpdate()==1){
                    return true;
                }
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    public static Servicio[] obtenerPrevistos(long idPresupuesto, GregorianCalendar fecha){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Servicio> servicios = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Servicios` INNER JOIN `gestionTienda`.`Servicios_estimados_Presupuesto` ON Servicios.idServicio = Servicios_estimados_Presupuesto.idServicio WHERE idPresupuesto = " + idPresupuesto + " AND fechaGenerado = '" + ConversorFecha.getFechaFormatoBD(fecha) + "'";
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Servicio temp = new Servicio();
                temp.setIdServicio(res.getInt(idServicio));
                temp.setNombre(res.getString(nombre));
                temp.setDescripcion(res.getString(descripcion));
                temp.setPrecio(res.getFloat(precio));
                temp.setTiempoEstimado(res.getInt(tiempoEstimado));
                temp.setUnidades(res.getInt(unidades));
                servicios.add(temp);
            }
            return servicios.toArray(new Servicio[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static Servicio[] obtenerUltimosPrevistos(long idPresupuesto){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Servicio> servicios = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Servicios` INNER JOIN `gestionTienda`.`Servicios_estimados_Presupuesto` ON Servicios.idServicio = Servicios_estimados_Presupuesto.idServicio WHERE idPresupuesto = " + idPresupuesto + " and fechaGenerado = (SELECT MAX(fechaGenerado) FROM Servicios_estimados_Presupuesto WHERE idPresupuesto = " + idPresupuesto + ")";
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Servicio temp = new Servicio();
                temp.setIdServicio(res.getInt(idServicio));
                temp.setNombre(res.getString(nombre));
                temp.setDescripcion(res.getString(descripcion));
                temp.setPrecio(res.getFloat(precio));
                temp.setTiempoEstimado(res.getInt(tiempoEstimado));
                temp.setUnidades(res.getInt(unidades));
                servicios.add(temp);
            }
            return servicios.toArray(new Servicio[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static Servicio[] obtenerPrestados(long idTarea){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Servicio> servicios = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Servicios` INNER JOIN `gestionTienda`.`Servicios_prestados_Tarea` ON Servicios.idServicio = Servicios_prestados_Tarea.idServicio WHERE idTarea = " + idTarea ;
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Servicio temp = new Servicio();
                temp.setIdServicio(res.getInt(idServicio));
                temp.setNombre(res.getString(nombre));
                temp.setDescripcion(res.getString(descripcion));
                temp.setPrecio(res.getFloat(precio));
                temp.setTiempoEstimado(res.getInt(tiempoEstimado));
                temp.setUnidades(res.getInt(unidades));
                servicios.add(temp);
            }
            return servicios.toArray(new Servicio[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    
}
